import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { VersioningType } from '@nestjs/common';

import * as session from 'express-session';

import { Request, Response, NextFunction } from 'express';

import { NestExpressApplication } from '@nestjs/platform-express';
import {join} from 'path';

import { ResponseInterceptor } from './common/responseInterceptor';
import { HttpFilter } from './common/filter'
import { ValidationPipe } from '@nestjs/common'
// import { RoleGuard } from './role/role.guard';

// 全局中间件，必须是函数，不能用类了
function middlewareAll (req:Request, res:Response, next:NextFunction) {
  console.log('middlewareAll');
  // 做拦截，鉴权
  next();
}

// 中间件第三方插件： cors 跨域解决
// 安装： npm install cors       npm install @types/cors -D


async function bootstrap() {
  // const app = await NestFactory.create(AppModule);
  const app = await NestFactory.create<NestExpressApplication>(AppModule);   // NestExpressApplication 这个可以用了开启很多方法提示
  app.useStaticAssets(join(__dirname, 'file'),{         // 这里是配置访问上传后的静态文件的
    // 这里做路径配置
    // ...
  })
  app.enableVersioning({              // 开启路由版本控制，restful风格  
    type: VersioningType.URI,
  })
  // 注入session中间件
  app.use(session({   // 获取设置验证码时，需要使用session
    secret: 'myhotnest',  // (加盐) session签名
    rolling: true,  // 当每次请求时强行重置cookie过期时间
    name: 'sms.sid',  // 设置名称, 默认是connect.sid
    // cookie: {   // 设置cookie的选项
    //   maxAge: 1000 * 60 * 60 * 24 * 30,  // 设置过期时间
    //   httpOnly: true,  // 设置是否只用于http请求中获取
    //   secure: false,  // 设置是否只用于https请求中获取
    // }
  }))

  app.useGlobalFilters(new HttpFilter());   // 配置全局过滤器，错误/异常拦截器
  app.useGlobalInterceptors(new ResponseInterceptor());   // 配置全局响应拦截器，类要实例化
  app.useGlobalPipes(new ValidationPipe());   // 全局管道，校验参数
  // app.useGlobalGuards(new RoleGuard());   // 全局守卫，校验权限

  app.use(middlewareAll);
  await app.listen(3000);
}
bootstrap();
